SELECTOR_KERNEL_CS  equ 8 ; 内核代码段的选择符，用于远跳转指令
 ; 其描述符是GDT的第2项
; 导入函数
extern  cstart

; 导入全局变量
extern  gdt_ptr

[SECTION .bss] ; 堆栈段
StackSpace  resb  2 * 1024  ; resb/w/d/q为声明未初始化空间的NASM伪命令
StackTop:       ; 栈顶

[section .text] ; 代码段在此

global _start   ; 导出 _start

_start:
    ; 把 esp 从 LOADER 挪到 KERNEL
    mov esp, StackTop   ; 堆栈在 bss 段中

    sgdt    [gdt_ptr]   ; 将由loader设置的GDT寄存器的值，保存到在start.c文件中
                ; 定义的GDT寄存器数组结构gdt_ptr中，在cstart()中将会用到
    call    cstart  ; 在此函数中改变了gdt_ptr，让它指向新的GDT
    lgdt    [gdt_ptr]   ; 使用新的GDT

    ;lidt   [idt_ptr]

    jmp SELECTOR_KERNEL_CS:csinit ; 强制使用刚刚初始化的GDT结构
csinit:
    push 0  ; EFLAGS = 0
    popfd   ; Pop top of stack into EFLAGS

    hlt     ; 停止处理器（停机）的系统CPU指令，使处理器进入HALT状态
